﻿#include <queue>
#include <iostream>
#include <memory.h>

using namespace std;

typedef pair<int, int> PII;
 

/*
123
https://www.papamelon.com/problem/244

某街区共有 R 条道路, N 个路口。
道路可以双向通行，问 1 号路口到 N 号路口的次短路长度是多少?
次短路指的是比最短路要长，且最短的路径。

该问题同一条边可以经过多次。

输入
第一行有两个整数 NN 和 RR
接下来的 R 行，每行有三个整数 x, y, D，表示 x 和 y 之间有一条边长度为 D 的路径
1≤N≤5000,1≤R≤100000,1≤D≤5000
输出
次短路的长度


样例 1
输入
4 4
1 2 100
2 3 250
2 4 200
4 3 100
输出
450
*/


const int N = 200010;
int h[N], e[N], ne[N], w[N], idx;
int n,r;
typedef pair<int, int> PII;
int dist[N];
int dist2[N];

void add(int a, int b, int c) {
	e[idx] = b; w[idx] = c; ne[idx] = h[a]; h[a] = idx++;
}

void dijkstra() {
	memset(dist, 0x3f, sizeof dist);
	memset(dist2,0x3f,sizeof dist2);
	dist[1] = 0;

	priority_queue<PII, vector<PII>, greater<PII>> q;
	q.push({0,1});

	while (q.size()) {
		auto t = q.top(); q.pop();
		int ver = t.second; int currD = t.first;

		for (int i = h[ver]; i != -1; i = ne[i]) {
			int j = e[i]; int Dis = currD + w[i];
			if (dist[j] > Dis) {
				swap(dist[j], Dis);
				q.push({ dist[j],j });
			}
			if (dist2[j] > Dis && Dis>dist[j]) {
				swap(dist2[j], Dis);
				q.push({ dist2[j],j });
			}
		}
	}

	return;
}


int main() {
	cin >> n >> r;
	memset(h,-1,sizeof h);
	for (int i = 0; i < r; i++) {
		int a, b, c;cin >> a >> b >> c;
		add(a, b, c); add(b, a, c);
	}

	dijkstra();

	cout << dist2[n] << endl;

	return 0;
}